package com.dys.teststreamapi11;

import com.dys.testlambda02.entity.Person;

import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @className: com.dys.teststreamapi11.StreamAPITest
 * @description: 对流中的数据做聚合计算
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/01 下午4:39
 */
public class StreamAPITest11 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        streamToAggregateComputation();
    }

    /**
     * 对流中的数据进行聚合计算
     */
    private static void streamToAggregateComputation() {
        // 获取年龄的最大值
        Optional<Person> maxAge = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 32),
                        new Person("李思思", 13),
                        new Person("黄晓彤", 20))
                .collect(Collectors.maxBy((p1, p2) -> p1.getAge() - p2.getAge()));
        System.out.println("最大年龄：" + maxAge.get());

        // 获取年龄的最小值
        Optional<Person> minAge = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 32),
                        new Person("李思思", 13),
                        new Person("黄晓彤", 20))
                .collect(Collectors.minBy((p1, p2) -> p1.getAge() - p2.getAge()));
        System.out.println("最小年龄：" + minAge.get());

        // 求所有人的年龄之和
        Integer sumAge = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 32),
                        new Person("李思思", 13),
                        new Person("黄晓彤", 20))
                .collect(Collectors.summingInt(Person::getAge));
        System.out.println("所有人年龄之和：" + sumAge);

        // 年龄的平均值
        Double avgAge = Stream.of(
                new Person("张三", 18),
                new Person("李四", 32),
                new Person("李思思", 13),
                new Person("黄晓彤", 20)).collect(Collectors.averagingInt(Person::getAge));
        System.out.println("平均年龄：" + avgAge);

        // 统计数量
        Long count = Stream.of(
                        new Person("张三", 18),
                        new Person("李四", 32),
                        new Person("李思思", 13),
                        new Person("黄晓彤", 20))
                .filter(s -> s.getAge() > 18)
                .collect(Collectors.counting());
        System.out.println("统计满足条件的记录数量：" + count);
    }
}
